// 利用express框架搭建服务器
const express = require('express');
const app = express();
const router = express.Router();
const cors = require('cors')
const port = 3000;
// ‌PassThrough流‌是Node.js中的一个流类型，属于双工流（duplex stream），
// 既可以读取数据，也可以写入数据。PassThrough流的主要特点是它不会对数据进行任何更改，
// 只是简单地将从可读流传递来的数据传输到可写流，通常用于需要将数据从一个流传递到另一个流的情况下，而无需对数据进行额外的处理‌
const { PassThrough } = require("stream")

// 解决跨域问题
app.use(cors())

router.get("/api/sendMsg", (req,res)=>{
    // 设置流式数据
     res.set({
        "Content-Type": "text/event-stream",
        "Cache-Control": "no-cache",
        "Connection": "keep-alive"
    })
    // 中断连接，浏览器一般默认3秒回进行重连
    // 也可以通过retry设置浏览器重新发起连接的时间间隔
    // 两种情况会导致浏览器重新发起连接：一种是时间间隔到期，二是由于网络错误等原因，导致连接出错
    res.write("retry: 10000\n");
    // 
    const stream = new PassThrough();
    res.body = stream
    stream.pipe(res);
    // 这里用定时器模拟写入数据，向客户端传递数字1到10
    let i=1;
    let timer = setInterval(() => {
        if(i>10){
            // 结束的时候发送stop表示此次请求的服务端数据推送完毕
            stream.write(`data: stop\n\n`);
            clearInterval(timer);
            // 结束流时调用end方法 确保所有的数据都被写入目标流，并且释放相关资源
            stream.end();
        }else{
            // stream.write(`event: msg\n`) // 自定义事件名 msg
            // 写入数据格式：data: content\n\n
            // data是客户端接收数据的键名，content是发送客户端的内容，`\n\n` 表示一条消息发送结尾。
            stream.write(`data: ${i}\n\n`);
            i++;
        }
    }, 500);
})

app.use(router)

app.listen(port ,()=>{
console.log(`服务器启动成功：http://localhost:${port}`);
})